package cn.qzbook.dao;

import cn.qzbook.domain.Student;
import org.apache.ibatis.annotations.*;

public interface StudentDao {

    /**
     * 增删改：
     *      注解内的SQL语句参数，除了是基本的数据类型，也可以是包装类
     *
     *      如：实体对象   student    或者  map类型，都可以
     *          条件：实体对象的属性名和数据库的字段名一致
     *               map的key和数据库字段名一致
     *
     *      如果是一个基本参数【SQL条件中只用到一个参数，参数的名字对不对应都可以】
     *          如果是多个基本类型的参数，在形参前面添加 @Param("key") 与SQL中的参数名对应起来即可
     *
     * */

    /**
     * 单个基本类型数据作为参数：MyBatis自动匹配，SQL参数和方法形参名字不用对应
     * */
    @Delete("delete from student where id = #{id}")
    public void deleteStu(int id);
    /**
     * 多个基本类型数据作为参数：MyBatis无法自动匹配，即使连个名字对应，因为无法匹配
     * 原因在于反射(1.7) 无法获取方法形参的名字
     * 这种情况下，在形参列表中使用@Param("key") 注解，将形参与SQL参数对应
     * */
    @Delete("delete from student where id = #{id} and name = #{name}")
    public void deleteStuWhereParam(@Param("id")int id,@Param("name") String name);
    /**
     * 除了使用@Param("key")注解之外，可以将SQL中的参数命名改为以下这种方式
     * MyBatis会根据形参的位置，与之一一匹配
     * */
    @Delete("delete from student where id = #{param1} and name = #{param2}")
    public void deleteStuWhere(int id,String name);


    /**
     * 以上使用delete举例，对于insert和update也是一样的
     * */
    @Insert("insert into student values(#{id},#{name},#{age})")
    public void insert(Student student);

    @Update("update student set name = #{name} , age =#{age} where id = #{id};")
    void update(Student student);

    @Select("select * from student")
    Student select();



}
